package com.anyext.storage.util.template;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import freemarker.template.SimpleScalar;
import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;

public class MappingParam implements TemplateMethodModel {

	public static String[]	marker	= { "?", "?,?", "?,?,?", "?,?,?,?", "?,?,?,?,?", "?,?,?,?,?,?", "?,?,?,?,?,?,?", "?,?,?,?,?,?,?,?", "?,?,?,?,?,?,?,?,?", "?,?,?,?,?,?,?,?,?,?", "?,?,?,?,?,?,?,?,?,?,?", "?,?,?,?,?,?,?,?,?,?,?,?", "?,?,?,?,?,?,?,?,?,?,?,?,?" };

	private List<Object>	params;

	public MappingParam(List<Object> params) {
		this.params = params;
	}

	/**
	 * ${mp(bean.property)}
	 */
	@Override
	@SuppressWarnings("unchecked")
	public TemplateModel exec(@SuppressWarnings("rawtypes") List params) throws TemplateModelException {
		int length = this.params.size();
		if(params != null && params.size() > 0) {
			Object value = params.get(0);
			if (value instanceof Collection) {
				this.params.addAll((Collection<Object>) value);
			} else if (value.getClass().isArray()) {
				this.params.addAll(Arrays.asList((Object[]) value));
			} else {
				this.params.add(value);
			}
		}
		length = this.params.size() - length;
		StringBuffer repeat = new StringBuffer(length * 2);
		if(length > 0) {
			int quotient = length / marker.length;
			int remainder = length % marker.length;
			for (int i = 0; i < quotient; i++) {
				repeat.append(marker[marker.length - 1]);
				if (i < quotient - 1 || remainder > 0) {
					repeat.append(",");
				}
			}
			if (remainder > 0) {
				repeat.append(marker[remainder - 1]);
			}
		}
		return new SimpleScalar(repeat.toString());
	}

}
